]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st-entry: Change the pointer cursor on enter/leave events
authorThomas Wood <thomas.wood@intel.com>
Mon, 29 Oct 2012 15:47:25 +0000 (15:47 +0000)
committerThomas Wood <thomas.wood@intel.com>
Tue, 6 Nov 2012 11:47:49 +0000 (11:47 +0000)
Change the pointer cursor to an i-beam when it is inside the ClutterText.

https://bugzilla.gnome.org/show_bug.cgi?id=687130

src/st/st-entry.c

index ad9b3a84f84847e27459e1a646abb43c27ed0052..4cd1da6fae0b2966d7592e54786c16ca042aa5e4 100644 (file)
 #include "st-clipboard.h"
 #include "st-private.h"
 
+#include <clutter/x11/clutter-x11.h>
+#include <X11/Xlib.h>
+#include <X11/cursorfont.h>
+
 #include "st-widget-accessible.h"
 
 #define HAS_FOCUS(actor) (clutter_actor_get_stage (actor) && clutter_stage_get_key_focus ((ClutterStage *) clutter_actor_get_stage (actor)) == actor)
@@ -613,6 +617,38 @@ st_entry_key_focus_in (ClutterActor *actor)
   clutter_actor_grab_key_focus (priv->entry);
 }
 
+static void
+st_entry_set_cursor (StEntry  *entry,
+                     gboolean  use_ibeam)
+{
+  Display *dpy;
+  ClutterActor *stage, *actor = CLUTTER_ACTOR (entry);
+  Window wid;
+  static Cursor ibeam = None;
+
+  dpy = clutter_x11_get_default_display ();
+  stage = clutter_actor_get_stage (actor);
+  wid = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
+
+  if (ibeam == None)
+    ibeam = XCreateFontCursor (dpy, XC_xterm);
+
+  if (use_ibeam)
+    XDefineCursor (dpy, wid, ibeam);
+  else
+    XUndefineCursor (dpy, wid);
+}
+
+static gboolean
+st_entry_crossing_event (ClutterActor         *actor,
+                         ClutterCrossingEvent *event)
+{
+  if (event->source == ST_ENTRY (actor)->priv->entry && event->related != NULL)
+    st_entry_set_cursor (ST_ENTRY (actor), (event->type == CLUTTER_ENTER));
+
+  return FALSE;
+}
+
 static void
 st_entry_class_init (StEntryClass *klass)
 {
@@ -635,6 +671,9 @@ st_entry_class_init (StEntryClass *klass)
   actor_class->key_press_event = st_entry_key_press_event;
   actor_class->key_focus_in = st_entry_key_focus_in;
 
+  actor_class->enter_event = st_entry_crossing_event;
+  actor_class->leave_event = st_entry_crossing_event;
+
   widget_class->style_changed = st_entry_style_changed;
   widget_class->navigate_focus = st_entry_navigate_focus;
   widget_class->get_accessible_type = st_entry_accessible_get_type;